在递归中不断重复以下步骤: 若要将N层从X转移到Z,则需要将N-1层从X转移到Y,再将第N层从X转移到Z,最后将N-1层从Y转移到Z;将N层从从X转移到Y、Y转移到Z、Y转移到X、Z转移到X、Z转移到Y也类似。
返回条件:N == 1时,第N层直接转移到Z。(从X转移到Z情况)
以下N=5时运行的结果:
import java.util.Scanner;
public class HanoiTower
{
private int steps = 0;
public HanoiTower(){}
public int getSteps(){
return steps;
}
public void printXToZ(int num){
if(num == 1){
System.out.print(num + "->Z ");
steps++;
return;
}
printXToY(num - 1);
System.out.print(num + "->Z ");
steps++;
printYToZ(num - 1);
}
public void printYToZ(int num){
if(num == 1){
System.out.print(num + "->Z ");
steps++;
return;
}
printYToX(num - 1);
System.out.print(num + "->Z ");
steps++;
printXToZ(num - 1);
}
public void printYToX(int num){
if(num == 1){
System.out.print(num + "->x ");
steps++;
return;
}
printYToZ(num - 1);
System.out.print(num + "->x ");
steps++;
printZToX(num - 1);
}
public void printZToX(int num){
if(num == 1){
System.out.print(num + "->x ");
steps++;
return;
}
printZToY(num - 1);
System.out.print(num + "->x ");
steps++;
printYToX(num - 1);
}
public void printXToY(int num){
if(num == 1){
System.out.print(num + "->y ");
steps++;
return;
}
printXToZ(num - 1);
System.out.print(num + "->y ");
steps++;
printZToY(num - 1);
}
public void printZToY(int num){
if(num == 1){
System.out.print(num + "->y ");
steps++;
return;
}
printZToX(num - 1);
System.out.print(num + "->y ");
steps++;
printXToY(num - 1);
}
public static void main(String[] args)
{
int num;
Scanner scanner = new Scanner(System.in);
System.out.println("Please input the floors of HanoiTower:");
num = scanner.nextInt();
HanoiTower hanoiTower = new HanoiTower();
hanoiTower.printXToZ(num);//将汉诺塔从X位置移到Z位置
System.out.println();
System.out.println("Steps:" + hanoiTower.getSteps());
}
}